﻿#define _CRT_SECURE_NO_WARNINGS

//#include "RBTree.h"
//#include <vector>

//void test1()
//{
//    TL::RBTree<int, int> t;
//    //常规的测试⽤例
//    //int a[] = { 16, 3, 7, 11, 9, 26, 18, 14, 15 };
//
//    //特殊的带有双旋场景的测试⽤例
//    //int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14 };
//
//    //测试
//    int a[]{ 5, 0, 12, 17, 16, 8, 9, 14, 15, 13 };
//
//    for (auto e : a)
//    {
//        t.insert({e,e});
//    }
//    int size = 0;
//
//    for (auto e : a)
//    {
//        t.erase(e);
//        t.IsBalance();
//        if (size - t.size() >= 2)
//        {
//            cout << "一次至少删除了两个节点" << endl;
//            
//        }
//        size = t.size();
//    }
//
//    t.InOrder();
//    cout << t.IsBalance() << endl;
//    cout << t.size() << endl;
//    cout << t.height() << endl;
//}
//
//void test2()
//{
//    const int N = 100000;
//    vector<int> v;
//    v.reserve(N);
//    srand((unsigned int)time(NULL));
//    for (int i = 0; i < N; i++)
//    {
//        v.push_back(rand() + i);
//    }
//    size_t begin2 = clock();
//    TL::RBTree<int, int> t;
//    for (auto e : v)
//    {
//        t.insert({ e,e });
//    }
//    size_t end2 = clock();
//    cout << "Insert:" << end2 - begin2 << endl;
//    cout << t.IsBalance() << endl;
//    cout << "Height:" << t.height() << endl;
//    cout << "Size:" << t.size() << endl;
//    size_t begin1 = clock();
//
//    //随机值
//    for (int i = 0; i < N; i++)
//    {
//        t.find((rand() + i));
//    }
//    size_t end1 = clock();
//    cout << "find:" << end1 - begin1 << endl;
//
//    int size = t.size();
//
//    //删除测试
//    size_t begin3 = clock();
//    for (int i = 0; i < N; i++)
//    {
//        t.erase((rand() + i));
//        bool ret = t.IsBalance();
//        if (size - t.size() >= 2)
//        {
//            cout << "一次至少删除了两个节点" << endl;
//            //break;
//        }
//        size = t.size();
//    }
//    size_t end3 = clock();
//    cout << "erase:" << end3 - begin3 << endl;
//}
//
//void test3()
//{
//    TL::RBTree<int, int> t;
//    t.test();
//
//    vector<int> v = { 18, 25, 15, 6, 13, 37, 27, 17, 34, 9, 10, 23 };
//    for (auto e : v)
//    {
//
//        t.erase(e);
//        cout << t.IsBalance() << endl;
//    }
//}
//
//void test4()
//{
//    const int N = 10;
//    TL::RBTree<int, int> t;
//    while (1)
//    {
//        vector<int> v(N);
//        for (int i = 0; i < N; i++)
//        {
//            v[i] = rand() % 20;
//        }
//        for (auto e : v)
//        {
//            t.insert({ e,e });
//        }
//        for (auto e : v)
//        {
//            t.erase(e);
//            bool ret = t.IsBalance();
//            if (!ret)
//            {
//                FILE* pf = fopen("data.txt", "w");
//                if (pf == nullptr)
//                {
//                    perror("文件打开失败");
//                    return;
//                }
//                for (auto e : v)
//                {
//                    fprintf(pf, "%d ", e);
//                }
//                fclose(pf);
//                return;
//            }
//        }
//    }
//}
//
//int main()
//{
//    srand((unsigned int)time(NULL));
//    //test1();
//    test2();
//    //test3();
//    //差错测试
//    //test4();
//	return 0;
//}
//

#include "RBTree.h"
#include "map.h"
#include "set.h"

//template<class K, class V>
//struct KeyOfT
//{
//	const K& operator()(const pair<K,V>& kv)
//	{
//		return kv.first;
//	}
//};
//
//int main()
//{
//	
//	TL::RBTree<int, pair<int,int>, KeyOfT<int, int>, less<int>> t;
//	//测试
//    int a[]{ 5, 0, 12, 17, 16, 8, 9, 14, 15, 13 };
//
//    for (auto e : a)
//    {
//        t.insert({e,e});
//    }
//    int size = 0;
//
//    for (auto e : a)
//    {
//        t.erase(e);
//        t.IsBalance();
//        if (size - t.size() >= 2)
//        {
//            cout << "一次至少删除了两个节点" << endl;
//            
//        }
//        size = t.size();
//    }
//
//    t.InOrder();
//    cout << t.IsBalance() << endl;
//    cout << t.size() << endl;
//    cout << t.height() << endl;
//	return 0;
//}

//int main()
//{
//	TL::set<int> s;
//	int a[]{ 5, 0, 12, 17, 16, 8, 9, 14, 15, 13 };
//	for (auto e : a)
//	{
//		s.insert(e);
//	}
//	s.inorder();
//	cout << s.size() << endl;
//	cout << s.isbalance() << endl;
//	cout << endl;
//
//	//TL::set<int> s2 = s;
//
//	TL::set<int> s2;
//
//	s2 = s;
//
//	s2.inorder();
//	cout << s2.size() << endl;
//	cout << s2.isbalance() << endl;
//	cout << endl;
//
//	cout << s.empty() << endl;
//
//
//	/*for (auto e : a)
//	{
//		s.erase(e);
//	}*/
//	s.clear();
//	cout << s.empty() << endl;
//
//	/*s.inorder();
//	cout << s.size() << endl;
//	cout << s.isbalance() << endl;
//	cout << endl;*/
//	/*int* p = new int(6);
//	delete p;*/
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int& x = a;
//	cout << &a << endl;
//	cout << &x << endl;
//	return 0;
//}

//int main()
//{
//	TL::set<int> s;
//	int a[]{ 5, 0, 12, 17, 16, 8, 9, 14, 15, 13 };
//	for (auto e : a)
//	{
//		s.insert(e);
//	}
//	/*for (auto e : s)
//	{
//		cout << e << " ";
//	}*/
//	//TL::set<int>::const_iterator it = s.end();
//	//while (it != s.begin())
//	//{
//	//	
//	//	it--;
//	//	//*it += 2;
//	//	cout << *it << endl;
//	//}
//	//cout << endl;
//
//	int a2[] = { 16, 3, 7, 11, 9, 26, 18, 14, 15 };
//	TL::set<int> s2;
//	for (auto e : a2)
//	{
//		s2.insert(e);
//	}
//	//swap(s, s2);
//
//	cout << s2.count(3) << endl;
//	return 0;
//}

//int main()
//{
//	TL::map<int,int> m;
//	int a[]{ 5, 0, 12, 17, 16, 8, 9, 14, 15, 13 };
//	for (auto e : a)
//	{
//		m.insert({e,e});
//	}
//	/*for (auto e : s)
//	{
//		cout << e << " ";
//	}*/
//	//TL::set<int>::const_iterator it = s.end();
//	//while (it != s.begin())
//	//{
//	//	
//	//	it--;
//	//	//*it += 2;
//	//	cout << *it << endl;
//	//}
//	//cout << endl;
//
//	int a2[] = { 16, 3, 7, 11, 9, 26, 18, 14, 15 };
//	TL::map<int,int> m2;
//	for (auto e : a2)
//	{
//		m2.insert({e,e});
//	}
//	//swap(s, s2);
//
//	for (auto e : m)
//	{
//		cout << e.first << ":" << e.second << " ";
//	}
//	cout << endl;
//	TL::map<int, int>::iterator it = m2.begin();
//	while (it != m2.end())
//	{
//		//it->first++;
//		it->second;
//		cout << it->first << ":" << (*it).second << " ";
//		it++;
//	}
//	cout << endl;
//
//
//	cout << m2.count(3) << endl;
//	cout << m2[3] << endl;
//
//	return 0;
//}

int main()
{
    string arr[] = { "苹果", "香蕉", "苹果" , "苹果" , "梨子", "苹果", "梨子" ,"香蕉", "梨子" };
    TL::map<string, int> countMap;
    for (const auto& str : arr)
    {
        countMap[str]++;
    }
    for (const auto& e : countMap)
    {
        cout << e.first << ":" << e.second << endl;
    }
    cout << endl;
    return 0;
}
